package com.cqc.other.juc.producerConsumer.demo3;


import java.util.ArrayList;
import java.util.List;

/**
 * 演示 生产者和消费者模型的假死现象
 */
public class ThreadTest {
    /**
     * https://pzblog.cn/java/concurrent/concurrent-consumer.html
     * 生产者和消费者设计模型的实践思路：
     * 多生产者和多消费者  线程假死现象
     * 如果有生产者线程 a1 a2,消费者线程 b1 b2,
     * 当a1生产了足够的数据，缓冲区满的时候，a1就进入等待状态，并调用 condition.signal()或 Object.notify()会随机唤醒一个线程，
     * 如果唤醒的是a2,a2醒来后发现缓冲区还是满的， a2也进入等待状态
     * 这就是假死。
     *
     * 同理消费者线程也有这个情况。我们演示消费者线程造成的假死现象。
     * 只有12个线程，生产者线程只有1个(占比1/12)，消费者线程有11个（占比11/12=91.67%），
     * 最后在for中开启启动线程，确保消费者线程缓冲区没有数据的时候，
     * 要随机唤醒一个线程，由于消费者线程占比91.67%,所以唤醒消费者线程的概率大，而消费者线程发现缓冲区没有数据，就又进入了等待装袋
     */
    public static void main(String[] args) {
        Container container = new Container();

        List<Thread> list = new ArrayList<Thread>();
        ProducerThread producerThread = new ProducerThread(container, 100);
        list.add(producerThread);
        for (int i = 0; i < 11; i++) {
            ConsumerThread consumerThread = new ConsumerThread(container);
            list.add(consumerThread);
        }
        for (Thread thread : list) {
            thread.start();
        }
    }
}
